import pandas as pd
# LP - размер полости левого предсердия (см)
# LVSd - толщина межжелудочковой перегородки в диастолу (см)
# LVIDd - конечный диастолический размер левого желудочка (см)
# LVPWd - толщина задней стенки левого желудочка в диастолу (см)
# формула расчета массі миокарда формула ASE (американское общество эхокардиографии
# масса миокарда ЛЖ = 0,8*[1.04*((LVIDd+LVSd+LVPWd)**3-(LVIDd)**3)]+0.6]
# индекс массы миокарда - по формуле Дюбуа расчитываем площадь поверхности тела(PPT), а затем используем для расчета индекса
# PPT = 0,007184 * рост**0,725 * вес**0,425 (рост в см, вес в кг) Расчет площади поверхности тела производится по формуле Du Bois D., Du Bois E. F. (1916)
# ИММЛЖ = масса миокарда ЛЖ/PPT

# данные исследований УЗИ сердца. Принеобходимости возможно получение из БД.
data = {
    'patient_id': [1, 2, 3],
    'LVSd': [0.9, 0.8, 1.5],
    'LVIDd': [5.0, 4.8, 5.1],
    'LVPWd': [0.9, 0.8, 1.5],
    'height': [175, 180, 172],
    'weight': [70, 84, 92],
    'sex': ['man', 'woman', 'woman'],
}


df = pd.DataFrame(data)
# print(df[df['patient_id']==1])


class EchoConclud:
    '''
    этот Класс создан для того что бы сформировать заключение по поводу наличие или отсутствия гипертрофии миокарда
    левого желудочка. В качестве аргументов для формирования объекта необходимо предоставить Дата фрейм на
    основе словыаря (словарь имеет в качестве ключа наименование графы, в качестве значения это список.
    Так же необходимо объекту сообщить ID. Метод conclud() сформирует строку F, что будет иметь необходимые показатели
    состояния миокарда левого желудочка
    '''
    def __init__(self, df, patient_id):
        self.df = df[df['patient_id']==patient_id].reset_index(drop=True)
        self.id = patient_id
        self.mass_miocard_LV()
        self.immlv()
        self.rwt()
        self.conclud()
        self.level_hypertrophy()
        self.hypertrophy()

    def mass_miocard_LV(self):
        '''
        Метод производит вычисления Массы миокарда Левого Желудочка
        '''
        self.mass = 0.8 * (1.04 * ((self.df['LVIDd'] + self.df['LVSd'] + self.df['LVPWd']) ** 3 - (self.df['LVIDd']) ** 3)) + 0.6
        return self.mass

    def immlv(self):
        '''
        метод производит вычисления индекса массы миокарда Левого Желудочка
        '''
        qq = self.df['height'] ** 0.725
        qqq = self.df['weight'] ** 0.425
        self.PPT = 0.007184 * qq * qqq
        self.IMMLV = self.mass / self.PPT
        return self.IMMLV

    def rwt(self):
        '''
        Метод производит вычисления Относительной толщины стенки
        '''
        self.RWT = self.df['LVPWd'] * 2 / self.df['LVIDd']
        return self.RWT

    def level_hypertrophy(self):
        '''
        Метод производит определения геометрии миокарда Левого Желудочка
        '''
        sex = self.df['sex'].values[0]
        IMMLV_value = self.IMMLV.values[0]
        RWT_value = self.RWT.values[0]

        if sex == 'man':
            if IMMLV_value <= 115 and RWT_value <= 0.42:
                return 'Нормальная геометрия миокарда ЛЖ'
            elif IMMLV_value <= 115 and RWT_value > 0.42:
                return 'Концентрическое ремоделирование'
            elif IMMLV_value > 115 and RWT_value <= 0.42:
                return 'Эксцентрическая гипертрофия'
            else:
                return 'Концентрическая гипертрофия'
        elif sex == 'woman':
            if IMMLV_value <= 95 and RWT_value <= 0.42:
                return 'Нормальная геометрия миокарда ЛЖ'
            elif IMMLV_value <= 95 and RWT_value > 0.42:
                return 'Концентрическое ремоделирование'
            elif IMMLV_value > 95 and RWT_value <= 0.42:
                return 'Эксцентрическая гипертрофия'
            else:
                return 'Концентрическая гипертрофия'

    def hypertrophy(self):
        '''
        Метод производит оценку наличия и степени нарушения миокарда Левого Желудочка
        '''
        sex = self.df['sex'].values[0]
        IMMLV = self.IMMLV.values[0]
        if sex == 'man':
            if IMMLV >49 and IMMLV<=115:
                return 'норма'
            elif IMMLV >=116 and IMMLV<=131:
                return 'незначительное нарушение'
            elif IMMLV >=132 and IMMLV<=148:
                return 'умеренное нарушение'
            elif IMMLV >=149:
                return 'значительное нарушение'
        elif sex == 'woman':
            if IMMLV >43 and IMMLV<=95:
                return 'норма'
            elif IMMLV >=96 and IMMLV<=108:
                return 'незначительное нарушение'
            elif IMMLV >=109 and IMMLV<=121:
                return 'умеренное нарушение'
            elif IMMLV >=122:
                return 'значительное нарушение'

    def conclud(self):
        '''
        Метод формирует вывод состояния миокарда Левого Желудочка в виде F-строки
        :return:
        '''
        return f'Масса миокарда Левого желудочка: {self.mass.values[0]:.1f} г. \n' \
               f'Индекс массы миокарда: {self.IMMLV.values[0]:.1f} г/м2\n' \
               f'Относительная толщина стенки: {self.RWT.values[0]:.2f}\n' \
               f'Площадь поверхности тела пациента: {self.PPT.values[0]:.2f} м2\n'\
                     f'Состояние миокарда ЛЖ:  {self.level_hypertrophy()} \n'\
                     f'У пациента со стороны миокарда ЛЖ наблюдается: {self.hypertrophy()}'



patiant_W = EchoConclud(df, 1)


print(patiant_W .conclud())



